// abstract 定义抽象类
// 1、抽象类中可以包含抽象方法和非抽象方法
// 2、抽象类不能被实例化
// 3、抽象类的子类必须实现父类的所有抽象方法
// 4、抽象类可以有构造方法，用于子类实例化时调用
// 5、抽象类可以有成员变量
// 6、抽象类可以没有子类
abstract class Person {
    // 抽象方法： 没有方法体
    // 抽象方法必须在抽象类中定义
    // 抽象方法的子类必须实现该方法，除非子类也是抽象类
    public abstract void run();
}

class Student extends Person {
    @Override
    public void run() {
        System.out.println("Student.run");
    }
}

class Worker extends Person {
    @Override
    public void run() {
        System.out.println("Worker.run");
    }
}

public class Test {
    public static void main(String[] args) {
        // 利用多态+抽象类 : 面向接口编程
        Person p = new Student();
        p.run();
        p = new Worker();
        p.run();
    }
}